package com.songlanyun.modules.marketing.groupbuy.entity;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.songlanyun.common.drive.RootEntity;
import com.songlanyun.common.enums.OrderConstant;
import com.songlanyun.common.enums.RightsOrderConstant;
import com.songlanyun.modules.marketing.groupbuy.service.GroupBuyTeamService;
import com.songlanyun.modules.order.entity.Order;
import com.songlanyun.modules.order.service.OrderService;
import com.songlanyun.modules.rabbitmq.util.SpringContextUtil;
import lombok.Data;

import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;

/**
 * 拼团活动的成员
 * 
 * @author Mark
 * @email sunlightcs@gmail.com
 * @date 2020-11-27 14:03:39
 */
@Data
@TableName("yxt_marketing_group_buy_team_member")
public class GroupBuyTeamMember extends RootEntity<Long,GroupBuyTeamMember> implements Serializable {
	private static final long serialVersionUID = 1L;

	/**
	 * 
	 */
	@TableId
	private Long id;
	/**
	 * 所属商家
	 */
	@NotNull(message = "所属商家不能为空")
	private Long shopId;

	/**
	 * 所属店铺名称
	 */
	@NotBlank(message = "所属店铺名称不能为空")
	private String shopName;
	/**
	 * 拼团活动id
	 */
	@NotNull(message = "拼团活动id不能为空")
	private Long groupBuyId;
	/**
	 * 拼团活动商品id
	 */
	@NotNull(message = "拼团活动商品id不能为空")
	private Long groupBuyGoodsId;
	/**
	 * 组团id
	 */
	@NotNull(message = "组团id不能为空")
	private Long buyTeamId;


	/**
	 * 所属商品id
	 */
	@NotNull(message = "所属商品id不能为空")
	private Long goodsId;
	/**
	 * 商品标题
	 */
	@NotBlank(message = "商品标题不能为空")
	private String goodsTitle;
	/**
	 * 商品短标题
	 */
	private String shortGoodsTitle;

	/**
	 * 商品图片
	 */
	@NotBlank(message = "商品图片不能为空")
	private String goodsImg;

	/**
	 * 规格的Hash编码，方便去对应和查找
	 */
	private String skuHashCode;
	/**
	 * 规格集的文本显示值
	 */
	private String skuSetName;

	/**
	 * 单品标识
	 */
	@NotNull(message = "所属商品id不能为空")
	private Long singleGoodsId;

	/**
	 * 购买商品规格数量
	 */
	@Min(value = 1,message = "购买商品规格数量最小是1")
	private Integer number;

	/**
	 * 实际价格(会员打折或秒杀的实际价格或活动价)
	 */
	private BigDecimal realPrice;

	/**
	 * 总实际价格
	 */
	private BigDecimal totalRealPrice;

	/**
	 * 总优惠
	 */
	private BigDecimal totalReduced;

	/**
	 * 真实的物流费用
	 */
	private BigDecimal realFreight;

	/**
	 * 总费用(包含运费)
	 */
	private BigDecimal totalAmount;


	/**
	 * 会员id
	 */
	@NotNull(message = "会员id不能为空")
	private Long userId;

	/**
	 * 会员手机号
	 */
	@NotNull(message = "会员手机号")
	private String  userMobile;

	/**
	 * true,团长，false 成员
	 */
	@NotNull(message = "是否是团长")
	private Boolean leader;
	/**
	 * 订单id
	 */
	@NotNull(message = "订单id不能为空")
	private Long orderId;

	/**
	 * 支付订单id
	 */
	@NotNull(message = "支付订单id为空")
	private Long payOrderId;

	/**
	 * 子订单id
	 */
	@NotNull(message = "子订单id不能为空")
	private Long childOrderId;
	/**
	 * 订单编号
	 */
	@NotNull(message = "订单编号不能为空")
	private String orderCode;
	/**
	 * 加入时间
	 */
	@NotNull(message = "下单时间不能为空")
	private Date joinTime;
	/**
	 * 支付时间（支付时间没支付时是null）
	 */
	private Date payTime;
	/**
	 * 支付过期时间
	 */
	private Long payExpireTime;
	/**
	 * 0未支付 1支付成功，但业务发生异常需要发起退款 2支付成功，但业务发生异常自款成功 3支付成功，但业务发生异常退款失败 4支付失败 5已支付(已支付成功)
	 */
	private OrderConstant.PaymentStatus payStatus;
	/**
	 * 参团成功状态
	 */
	private Boolean joinStatus;
	/**
	 * 订单的维权状态（0没有，1维权中，2完成,3失败）
	 */
	private OrderConstant.RightsStatus rightsStatus;
	/**
	 * 0没有维权，1团过期自动维权退款，2成团后的会员维权
	 */
	private OrderConstant.MemberRightsType memberRightsType;
	/**
	 * 
	 */
	@TableField(fill = FieldFill.INSERT)
	private Date createTime;
	/**
	 * 
	 */
	@TableField(fill = FieldFill.INSERT_UPDATE)
	private Date updateTime;

	@Override
	public Long getIdentity() {
		return getId();
	}

	@JsonIgnore
	@TableField(exist = false)
	private Order order;
	@JsonIgnore
	public Order loadOrder()
	{
		if(order==null)
		{
			OrderService orderService = (OrderService)SpringContextUtil.getBean("orderService");
			order = orderService.getById(this.getOrderId());
		}
		return order;
	}


	@JsonIgnore
	@TableField(exist = false)
	private GroupBuyTeam groupBuyTeam;
	@JsonIgnore
	public GroupBuyTeam loadGroupBuyTeam()
	{
		if(groupBuyTeam==null)
		{
			GroupBuyTeamService service = (GroupBuyTeamService)SpringContextUtil.getBean("groupBuyTeamService");
			groupBuyTeam = service.getById(this.getBuyTeamId());
		}
		return groupBuyTeam;
	}

}
